// File: src/ui/qt/KingdonWindow.h
#pragma once
// 核心Qt框架
#include <QMainWindow>   // 主窗口框架
#include <QWidget>       // 所有可视化组件
#include <QObject>       // Qt对象
#include <QApplication>  //事件循环等功能
#include <QThread>       //线程

// UI组件
#include <QScrollArea>   // 滚动区域
#include <QLabel>        // 文本和图像
#include <QCheckBox>     // 复选框控件
#include <QVBoxLayout>   // 垂直界面管理
#include <QHBoxLayout>   // 水平界面管理
#include <QProgressBar>  // 进度条
#include <QPushButton>   // 按钮
#include <QLineEdit>     // 单行文本输入框
#include <QTableWidget>  // 表格：任务列表
#include <QPalette>      // UI调色板

//对话框和表单相关
#include <QDialog>       // 对话框
#include <QDialogButtonBox>// 对话框确认/取消按钮
#include <QFormLayout>   // 表单布局
#include <QHeaderView>   // 表头视图
#include <QComboBox>     // 下拉选择框（优先级、分类选择）
#include <QMessageBox>   // 消息提示框

//日期和时间处理
#include <QDateTime>     // 日期时间类型
#include <QDateTimeEdit> // 日期编辑器（设定任务开始和提醒时间）

// 多媒体
#include <QMediaPlayer>  // 音频播放器
#include <QAudioOutput>  // 音频输出控制

// 文件管理
#include <QDir>          // 目录操作处理音频文件路径
#include <QUrl>          // 指定音频文件路径
// 文本处理
#include <QTextEdit>     // 文本编辑框
#include <QString>       // 替代std::string


#include "VoiceRecognition.h"
#include "BaiduASR.h"
#include "game/xp/XPSystem.h"
#include "game/territory/Territory.h"
#include "ui/cli/CliHandler.h"
//#include "core/tasks/TaskManager.h"

class KingdomWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit KingdomWindow(XPSystem& xpSystem, 
                         std::vector<Territory>& territories,
                         std::string& username,
                         QWidget *parent = nullptr);
    ~KingdomWindow() {
        m_daemon.stop();
        QCoreApplication::processEvents();
    }
    static bool showLoginDialog(QString& outUsername, QString& outPassword, 
        bool& outIsRegister);
    void playSound(const QString& filePath);
protected:
    void closeEvent(QCloseEvent* event);

private:
    QMediaPlayer* audioPlayer;  // 音频播放器
    QWidget* m_background;  // 背景纹理部件
    QMediaPlayer* reminderPlayer; // 专用提醒播放器
    int chineseToArabic(const QString& chineseNum);
    void setupUI();
    void setConnect();
    void updateDisplay();
    void initTaskTable();

    void playReminderSound(const QString& resourcePath);
    
    void setupReminderPanel();
    // void showReminder(const QString& message); //被含有语音识别功能的函数替代
    void dismissReminder();

    //void postVoiceCommand(const QString& command);
    //void postVoiceError(const QString& error);
    //void postStatusUpdate(const QString& status);
    void showVoiceCommandHelp();


    std::string& m_username;// 用户名
    XPSystem& m_xpSystem;// 经验值系统
    std::vector<Territory>& m_territories;// 领土系统
    TaskManager m_taskManager;// 任务添加、删除等功能
    AuthManager m_authManager;// 用户认证功能
    ReminderDaemon m_daemon;// 提醒模块
    
    // UI Elements
    QLabel* m_titleLabel;
    QLabel* m_levelLabel;
    // 游戏界面相关
    QProgressBar* m_xpProgress; //xP值进度条
    QLabel* m_xpLabel;
    QWidget* m_territoriesWidget;
    QMap<TerritoryType, QIcon> m_territoryIcons; // 存储领土类型对应的图标
    // 任务表格
    QTableWidget* m_taskTable;
    
    QPushButton* m_addTaskBtn; //添加任务按钮

    QPushButton* m_deleteTaskBtn; //删除任务按钮
    QLineEdit* m_taskIdInput; //删除任务时任务ID输入框

    // 日期筛选
    QPushButton* m_filterByDateBtn; // 按日期筛选按钮
    QDateEdit* m_dateFilterEdit; //日期筛选输入框

    // 月份筛选
    QPushButton* m_filterByMonthBtn; // 按月份筛选按钮
    QDateEdit* m_monthFilterEdit; // 月份筛选输入框
    QPushButton* m_clearFilterBtn; // 清除筛选按钮

    // 提醒功能
    QWidget* m_reminderPanel; // 提醒窗格
    QLabel* m_reminderLabel; // 提醒文本
    QPushButton* m_reminderDismissBtn; // 关闭提醒按钮

    // 语音识别相关
    VoiceRecognition* m_voiceRecognition;  // 语音对象
    BaiduASR* m_baiduASR;                  // 语音识别助手
    QPushButton* m_voiceControlBtn;        // 语音控制按钮
    QLabel* m_voiceStatusLabel;            // 语音状态显示标签

public slots:// 槽函数，可被信号函数触发，也可以被普通方式调用
    void addTask(const QString& name, const QDateTime& start, 
                const QString& priority, const QString& category, 
                const QDateTime& remindTime);
    void deleteTask(int taskId);
    void refreshTasks();
    void filterByDate(QDate date);
    void filterByMonth(QDate date);
    void clearFilter();

signals:// 信号函数
    void requestAddTask(const QString& name, const QDateTime& startTime, 
                       const QString& priority, const QString& category,
                       const QDateTime& remindTime);
    void requestDeleteTask(int);
    void requestFilterByDate(QDate);
    void requestFilterByMonth(QDate);
    void requestClearFilter();
    void reminderTriggered(QString message, int priority); // 提醒面板函数，已添加优先级参数
private slots:// 槽函数，可被信号函数触发，也可以被普通方式调用
    // 按钮部分
    void onAddTaskClicked();
    void onDeleteTaskClicked();
    void onFilterByDateClicked();
    void onFilterByMonthClicked();
    void onClearFilterClicked();
    // 语音部分
    void onVoiceControlClicked();  // 语音控制按钮点击
    void onRecordingFinished(); // 录音完成后的处理
    void handleVoiceCommand(const QString& command); // 处理语音命令
    void handleVoiceError(const QString& error); // 处理语音识别错误 
    void showReminder(const QString& message, int priority); // 添加优先级参数
private:
    // 游戏中字符串与优先级、任务类型、领土类型三种枚举类型转换
    Priority convertPriority(const QString& priority) {
        static QHash<QString, Priority> map = {
            {"low", Priority::LOW},
            {"medium", Priority::MEDIUM},
            {"high", Priority::HIGH}
        };
        return map.value(priority.toLower(), Priority::MEDIUM);
    }
    
    Category convertCategory(const QString& category) {
        static QHash<QString, Category> map = {
            {"study", Category::STUDY},
            {"work", Category::WORK},
            {"entertainment", Category::ENTERTAINMENT},
            {"life", Category::LIFE}
        };
        return map.value(category.toLower(), Category::LIFE);
    }

    TerritoryType getTerritoryTypeForCategory(Category category) const
    {
        switch (category) {
            case Category::STUDY: return TerritoryType::CASTLE;
            case Category::WORK: return TerritoryType::MOUNTAIN;
            case Category::ENTERTAINMENT: return TerritoryType::RIVER;
            case Category::LIFE: return TerritoryType::FOREST;
            default: return TerritoryType::PLAIN;
        }
    }
};